# -*- coding: utf-8 -*-
"""
Created on Fri Mar 1 10:55:29 2019

@author: MaYuling
"""

import pandas as pd
import numpy as np
df=pd.read_csv(r"C:\Users\MaYuling\Desktop\lianjia_uncleardata.csv",encoding='utf-8')
df=df.drop_duplicates(['链家编号']) # 去重
df=df.drop(["链家编号"],axis=1)
#%% 观察数据-数据清洗
# 描述统计
num_desc=df.describe(include=['number']).round(2)
obj_desc=df.describe(include=['object']).round(2).T
# 根据经验常识去掉不合乎常理的数值
data=df.drop(df[(df['成交周期']<5)|(df['成交周期']>500)|(df['单位价格']<1000)|(df['单位价格']>50000)|
                (df['成交价格']<10)|(df['成交价格']>800)|(df['挂牌价格']<10)|(df['挂牌价格']>800)|
                (df['浏览次数']<30)|(df['浏览次数']>10000)].index)
'''
    清洗非数值型数据:建筑类型、建筑结构、房屋户型、所在楼层、房屋朝向等
'''
# 清洗建筑类型，平房只有8条数据，舍去
data['建筑类型'].value_counts()
del_index=data[data['建筑类型']=="平房"].index 
data=data.drop(index=del_index)
# 清洗建筑结构，分为钢混结构和非钢混结构
data['建筑结构'].value_counts()
def manual_binning1(item):
    if item=='钢混结构':
        return '钢混结构'
    elif item=='砖混结构':
        return '砖混结构'
    else:
        return '其他结构'
data['建筑结构']=data['建筑结构'].apply(manual_binning1)
# 清洗房屋户型，主流户型，其他户型
house_counts=data['房屋户型'].value_counts()
data['房屋户型']=data['房屋户型'].apply(lambda x:x[0])
# 可不按居室分类，但类型太多
#list_hx=['2室2厅1厨1卫','3室2厅1厨2卫','2室1厅1厨1卫','1室1厅1厨1卫','3室2厅1厨1卫','4室2厅1厨2卫','1室0厅1厨1卫','3室1厅1厨1卫','3室1厅1厨2卫']
def manual_binning2(item):
    if item=='1':
        return '一居室'
    elif item=='2':
        return '二居室'
    elif item=='3':
        return '三居室'
    else:
        return '多居室'
data['房屋户型']=data['房屋户型'].apply(manual_binning2)
# 清洗所在楼层，提取高中低，删除地下室
data['所在楼层'].value_counts()
data['所在楼层']=data['所在楼层'].apply(lambda x:x[0])
data=data.drop(index=data[data['所在楼层']=="地"].index)
# 清洗房屋朝向
house_cx=data['房屋朝向'].value_counts()
#del_index=data[data['房屋朝向'].isin(house_cx[house_cx<2000].index)].index #可删除
list_cx=['南','东南','东','西南','北','西北','西','东北']
def manual_binning3(item):
    if item in list_cx:
        return item
    else:
        return '其他'
data['房屋朝向']=data['房屋朝向'].apply(manual_binning3)
# 装修情况、产权年限、配备电梯
data['装修情况'].value_counts()
data['产权年限'].value_counts()
data['配备电梯'].value_counts()
# 梯户比例 分为高<=2 中<=3 低
house_th=data['梯户比例'].value_counts()
list_h=['一梯两户','两梯四户','三梯六户','两梯三户','两梯两户','三梯四户','四梯八户','三梯五户','四梯六户','一梯一户','四梯七户','三梯三户','六梯七户','三梯两户','两梯一户','四梯四户','四梯五户','四梯两户','八梯四户','五梯十户','六梯六户','六梯八户','八梯两户','五梯八户','八梯十三户','十六梯三户','十一梯两户','十六梯四户','三梯一户']
list_n=['两梯六户','两梯五户','三梯八户','一梯三户','三梯七户','三梯九户','八梯二十四户','四梯十户','六梯十四户','四梯十二户','四梯九户','四梯十一户','六梯十六户','五梯十五户','六梯十七户','八梯二十二户','二十三梯六户','八梯十八户','六梯十三户','五梯十四户','六梯十五户','八梯二十户','六梯十八户']
def manual_binning4(item):
    if item in list_h:
        return '高梯户比'
    elif item in list_n:
        return '一般梯户比'
    else:
        return '低梯户比'
data['梯户比例']=data['梯户比例'].apply(manual_binning4)
# 交易权属，非商品房数据删除
data['交易权属'].value_counts()
data=data.drop(index=data[data['交易权属']!="商品房"].index)
# 房屋用途，非普通住宅数据删除
data['房屋用途'].value_counts()
data=data.drop(index=data[data['房屋用途']!="普通住宅"].index)
# 区域1 共13个，划分为三类，区域2区域3不处理
house_qy=data['区域1'].value_counts()
data=data.drop(index=data[data['区域1'].isin(['新津','都江堰'])].index)
list_z=['武侯','成华','青羊','金牛','锦江']
list_g=['高新','高新西','天府新区']
def manual_binning5(item):
    if item in list_g:
        return '功能经济区'
    elif item in list_z:
        return '主城五区'
    else:
        return '新中心城区'
data['区域划分']=data['区域1'].apply(manual_binning5)
# 建筑面积分箱
group_names = ['50平以下', '50-70平', '70-90平', '90-110平','110-130平','130-150平','150平以上']
bins=[0,50,70,90,110,130,150,1000]
data['面积分布']= pd.cut(data['建筑面积'], bins,labels = group_names)
house_mj=data['面积分布'].value_counts()
data['面积分布'].get_values()
# 关注人数分箱
data['关注人数'].describe()
group_names=['5人以下','5-10人','10-15人','15-20人','20-25人','25-30人','30-35人','35-40人','40-45人','45-50人','50人以上']
bins=[0,5,10,15,20,25,30,35,40,45,50,1010]
data['关注分布']= pd.cut(data['关注人数'],bins,labels = group_names)
data['关注分布']=data['关注分布'].fillna('5人以下')
house_gz=data['关注分布'].value_counts()
data['关注人数'].value_counts()
# 时间类型转换
data['挂牌时间']=pd.to_datetime(data['挂牌时间'])
data['成交时间']=pd.to_datetime(data['成交时间'])
data1= data.set_index('挂牌时间')
#%% 特征构造:限购政策 同小区房源数量 同小区挂牌价格 同区域的平均TOM 房屋年龄

# 添加两个特征-日均关注人数和日均浏览量
data1['日均关注人数']=(data1['关注人数']/data1['成交周期']).round(2)
data1['日均浏览量']=(data1['浏览次数']/data1['成交周期']).round(2)
# 根据挂牌时间，限购政策分类
data1['限购政策']='限购政策1'
data1.loc['2017-04-12':'2018-05-15','限购政策'] = '限购政策2'
data1.loc['2018-05-15':,'限购政策']='限购政策3'
data1['限购政策'].value_counts()
# 同区域的平均TOM
house_qy2=data['区域2'].value_counts()
Avg_TOM=data1['成交周期'].groupby(data1['区域2']).mean().astype(int)
data2=pd.DataFrame({'区域2':Avg_TOM.index,'同区域平均TOM':Avg_TOM})
data1=pd.merge(data1,data2,on='区域2')
# 同小区的房源数量
house_qy3=data['区域3'].value_counts()
data2=pd.DataFrame({'区域3':house_qy3.index,'同小区房源数':house_qy3})
data1=pd.merge(data1,data2,on='区域3')
# 同小区的挂牌价差
price_xq=data1['挂牌价格'].groupby(data1['区域3']).mean().round(2)
data2=pd.DataFrame({'区域3':price_xq.index,'价格差异':price_xq})
data1=pd.merge(data1,data2,on='区域3')
data1['价格差异']=data1['价格差异']-data1['挂牌价格']
# 年份转化为房龄
data1['房屋年龄']=2018-data1['建成年代']
# 房屋用途都为普通住宅,交易权属都为商品房,产权年限都为70年,区域主要由区域1值区分,带看次数不为0值过少
data1['房屋用途'].value_counts()
data1['交易权限'].value_counts()
data1['带看次数'].value_counts() 
data1['产权年限'].value_counts()
data1=data1.drop(['房屋用途','交易权属','产权年限','区域2','区域3','带看次数'],axis=1)
#%% 重新描述统计并保存预处理数据
obj_desc1=data1.describe(include=['object']).round(2)
num_desc1=data1.describe(include=['number']).round(2)
data1.to_csv(r"C:\Users\MaYuling\Desktop\lianjia_cleardata.csv", encoding='utf_8_sig',index=None)
